package com.lry.basic.spring.ioc;

import org.junit.platform.commons.util.StringUtils;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.List;

public interface BeanDefinition {
    String SCOPE_SINGLETON = "singleton";
    String SCOPE_PROTOTYPE = "prototype";

    Class<?> getBeanClass();

    void setBeanClass(Class<?> clazz);

    String getScope();

    void setScope(String scope);

    boolean isSingleton();

    boolean isPrototype();

    void setLazyInit(boolean lazyInit);

    boolean isLazyInit();

    String getFactoryBeanName();

    void setFactoryBeanName(String factoryBeanName);

    String getFactoryMethodName();

    void setFactoryMethodName(String factoryMethodName);

    String getInitMethodName();

    void setInitMethodName(String initMethodName);

    String getDestroyMethodName();

    void setDestroyMethodName(String destroyMethodName);

    Constructor<?> getConstructor();

    void setConstructor(Constructor<?> constructor);

    Object[] getConstructorArgumentRealValues();
    void setConstructorArgumentRealValues(Object[] constructorArgumentRealValues);

    List<?> getConstructorArgumentValues();

    void setConstructorArgumentValues(List<?> constructorArgumentValues);

    Method getFactoryMethod();

    void setFactoryMethod(Method factoryMethod);

    List<PropertyValue> getPropertyValues();

    void setPropertyValues(List<PropertyValue> propertyValues);

    default boolean validate(){
        if(this.getBeanClass()==null){
            if(StringUtils.isBlank(this.getFactoryBeanName())||
                    (StringUtils.isBlank(this.getFactoryMethodName()))){
                return false;
            }
        }

        if(this.getBeanClass()!=null
                &&!StringUtils.isBlank(this.getFactoryBeanName())){
            return false;
        }
        return true;
    }
}
